import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib
import matplotlib.font_manager as fm
import random
import time
import config
import os
import platform

matplotlib.use('Agg')  # 适用于无 GUI 服务器

# **动态检查并加载 Linux 服务器上的中文字体**
font_path_linux = "/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc"
font_prop = None

# 检查操作系统
current_os = platform.system()

# 如果是 Linux 系统并且字体文件存在，加载中文字体
if current_os == "Linux" and os.path.exists(font_path_linux):
    font_prop = fm.FontProperties(fname=font_path_linux)  # 加载文泉驿正黑字体
    rcParams['font.sans-serif'] = [font_prop.get_name()]
    print(f"[INFO] 使用字体: {font_prop.get_name()}")
else:
    print("[INFO] 没有找到字体文件或非 Linux 系统，默认字体将会使用。")
    # 如果不是 Linux 或者字体未找到，使用默认字体

# 设置负号显示问题
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 增大字体大小（默认设置为 14，可以根据需要进行调整）
font_size = 16  # 设置更大的字体大小

# 更新 rcParams 中字体大小
rcParams['font.size'] = font_size  # 设置全局字体大小
rcParams['axes.labelsize'] = font_size  # 设置坐标轴标签字体大小
rcParams['xtick.labelsize'] = font_size  # 设置 x 轴刻度标签字体大小
rcParams['ytick.labelsize'] = font_size  # 设置 y 轴刻度标签字体大小

def draw_combined_heatmap_scatter(file_path, select_feature, s=1, cmap="coolwarm"):
    timestamp = int(time.time() * 1000)  # 当前时间戳（毫秒）
    random_number = random.randint(1000, 9999)  # 生成四位随机数
    output_filename = f"{timestamp}_{random_number}.png"  # 拼接文件名

    # 设定输出文件夹路径
    output_dir = config.OUTPUT_FOLDER_ONE_UPPER_BLEWBLEW  # 选择 config.py 里的路径
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 拼接完整的输出文件路径
    output_file = os.path.join(output_dir, output_filename)

    """
    参数：
    - file_path: 输入文件路径，支持 Excel 格式。
    - select_feature: 目标列名称。
    - cmap (str): 热图的配色方案，默认为 "coolwarm"。
    """
    # 读取数据
    df = pd.read_excel(file_path, engine='openpyxl')
    df = df[select_feature]

    # 计算相关矩阵
    correlation_matrix = df.corr()

    # 获取变量数量
    n = len(correlation_matrix.columns)

    # 设置画布和网格布局
    fig, axes = plt.subplots(n, n, figsize=(12, 12))

    # 遍历矩阵，绘制下三角散点图和对角线部分
    for i in range(n):
        for j in range(n):
            ax = axes[i, j]  # 获取子图
            if i >= j:  # 下三角部分绘制散点图
                ax.scatter(df.iloc[:, j], df.iloc[:, i], alpha=0.5, s=s, color="blue")
                ax.set_xticks([])
                ax.set_yticks([])
            else:  # 上三角部分留空
                ax.axis('off')

            # **确保 font_prop 可用**
            if i == n - 1:  # 最底部的图添加 x 轴标签
                ax.set_xlabel(correlation_matrix.columns[j], fontsize=font_size, rotation=90, fontproperties=font_prop)
            if j == 0:  # 最左侧的图添加 y 轴标签
                ax.set_ylabel(correlation_matrix.columns[i], fontsize=font_size, rotation=0, labelpad=40, fontproperties=font_prop)

    # 单独绘制上三角热图
    mask = np.tril(np.ones_like(correlation_matrix, dtype=bool))  # 遮盖下三角
    sns.heatmap(
        correlation_matrix,
        mask=mask,  # 应用遮罩，只显示上三角
        annot=True,
        fmt=".2f",
        cmap=cmap,  # 彩色热图
        cbar=False,
        xticklabels=False,
        yticklabels=False,
        ax=fig.add_subplot(111, frameon=False)  # 添加到整个图上，作为背景
    )

    # 调整布局
    plt.subplots_adjust(wspace=0, hspace=0)  # 消除网格间隙

    # 保存图像
    fig.savefig(output_file)
    print(f"图像已保存至: {output_file}")
    return output_file
